import axios from 'axios'
import { useAuthStore } from '../store/useAuthStore'
import { ElMessage } from 'element-plus'
import router from '../router'
import type { AxiosRequestConfig, AxiosDefaults, HeadersDefaults, AxiosHeaderValue } from 'axios'

// 为Axios添加自定义配置
interface CustomRequestConfig extends AxiosRequestConfig {
  retry?: number;
  retryCount?: number;
  retryDelay?: number;
  _retry?: boolean;
}

// 声明模块增强
declare module 'axios' {
  interface AxiosRequestConfig {
    retry?: number;
    retryCount?: number;
    retryDelay?: number;
    _retry?: boolean;
  }
}

// 创建axios实例
const api = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || 'http://127.0.0.1:8080',
  timeout: 10000, // 超时时间从60秒改为更合理的10秒
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json'
  }
}) as any

// 添加自定义配置
api.defaults.retry = 2
api.defaults.retryDelay = 1000

// 请求拦截器
api.interceptors.request.use(
  (config: AxiosRequestConfig) => {
    // 获取token
    const token = localStorage.getItem('token')
    
    // 如果有token，先检查是否过期
    if (token) {
      try {
        // 解析token
        const payload = JSON.parse(atob(token.split('.')[1]))
        const expirationTime = payload.exp * 1000
        const now = Date.now()
        const timeToExpire = Math.floor((expirationTime - now) / 1000) // 转换为秒
        
        // 记录token状态
        console.log('Token状态检查:', {
          expirationTime: new Date(expirationTime).toLocaleString(),
          now: new Date(now).toLocaleString(),
          timeToExpire: `${timeToExpire}秒`,
          isExpired: now >= expirationTime
        })
        
        // 如果token已过期，尝试刷新
        if (now >= expirationTime) {
          console.warn('Token已过期')
          // 这里可以添加刷新token的逻辑
          // const authStore = useAuthStore()
          // try {
          //   const newToken = await authStore.refreshToken()
          //   if (newToken) {
          //     config.headers = config.headers || {}
          //     config.headers.Authorization = `Bearer ${newToken}`
          //     return config
          //   }
          // } catch (error) {
          //   console.error('刷新Token失败:', error)
          // }
        }
        
        // 添加到请求头
        config.headers = config.headers || {}
        config.headers.Authorization = `Bearer ${token}`
      } catch (e) {
        console.warn('Token解析失败，继续发送请求:', e)
        // 解析失败也继续发送请求，让服务器来判断token的有效性
        config.headers = config.headers || {}
        config.headers.Authorization = `Bearer ${token}`
      }
    }
    
    return config
  },
  (error: any) => {
    return Promise.reject(error)
  }
)

// 响应拦截器，将axios返回类型转换为直接返回响应数据
api.interceptors.response.use(
  (response: any) => {
    // 直接返回响应数据，而不是完整的响应对象
    return response.data
  },
  async (error: any) => {
    const originalRequest = error.config
    
    // 处理连接超时和网络错误
    if (error.code === 'ETIMEDOUT' || error.code === 'ECONNABORTED' || error.message.includes('timeout') || !error.response) {
      // 重试逻辑
      const retryCount = originalRequest.retryCount || 0
      
      // 获取重试配置
      const maxRetries = originalRequest.retry || api.defaults.retry || 2
      const retryDelay = originalRequest.retryDelay || api.defaults.retryDelay || 1000
      
      if (retryCount < maxRetries) {
        // 等待后重试
        await new Promise(resolve => setTimeout(resolve, retryDelay))
        
        // 增加重试计数
        originalRequest.retryCount = retryCount + 1
        
        ElMessage.warning(`网络连接超时，正在重试(${originalRequest.retryCount}/${maxRetries})...`)
        return api(originalRequest)
      } else {
        ElMessage.error('网络连接失败，请检查您的网络或稍后重试')
      }
    }
    
    // 处理401错误（未授权）
    if (error.response && error.response.status === 401) {
      // 清除所有登录信息
      localStorage.removeItem('token')
      localStorage.removeItem('user')
      localStorage.removeItem('refresh_token')
      
      const authStore = useAuthStore()
      authStore.$reset()
      
      // 跳转到登录页
      ElMessage.error('登录已过期，请重新登录')
      router.push('/auth/login')
    }
    
    // 处理403错误（禁止访问）
    if (error.response && error.response.status === 403) {
      ElMessage.error('没有权限执行此操作')
    }
    
    // 处理500错误（服务器错误）
    if (error.response && error.response.status >= 500) {
      ElMessage.error('服务器错误，请稍后重试')
    }
    
    return Promise.reject(error.response?.data || error)
  }
)

export default api 